﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System.Configuration;

namespace Pittypat.Configuration
{
    /// <summary>
    /// 用于配置一个模块。
    /// </summary>
    public sealed class ModuleConfig : ConfigurationElement
    {
        /// <summary>
        /// 获取或者设置模块的标识符。
        /// </summary>
        [ConfigurationProperty("identifier", IsRequired = true, IsKey = true)]
        public string Identifier
        {
            get
            {
                return (string)this["identifier"];
            }
            set
            {
                this["identifier"] = value;
            }
        }
        
        /// <summary>
        /// 获取或者设置模块使用的数据服务。其值可以为预定义的 MySql、SqlServer，也可以是自定义的实现了 <see cref="Data.IDataService"/> 接口的类型完整名称。
        /// </summary>
        [ConfigurationProperty("dataServiceType", IsRequired = false)]
        public string DataServiceType
        {
            get
            {
                return (this["dataServiceType"] as string) ?? "";
            }
            set
            {
                this["dataServiceType"] = value;
            }
        }

        /// <summary>
        /// 获取或者设置当前模块的 <see cref="Module.DataService"/> 的路径。
        /// </summary>
        /// <remarks>
        /// <para>对于数据库服务为连接字符串，对于文件可能是文件路径，对于 Web Service 则为服务路径。</para>
        /// <para>如果路径中包含了敏感信息，则可以提供加密后的路径，并提供 <see cref="PittypatConfig.DataServiceUrlDecryptor"/>，以便对路径进行解密。</para>
        /// </remarks>
        [ConfigurationProperty("dataServiceUrl", IsRequired = false)]
        public string DataServiceUrl
        {
            get
            {
                return (string)this["dataServiceUrl"];
            }
            set
            {
                this["dataServiceUrl"] = value;
            }
        }

        /// <summary>
        /// 获取或者设置模块使用的数据架构的名称，用于确定目标存储过程隶属的数据库架构。如果没有提供，则默认为 "{developerCode}_{appIdentifier}"。
        /// </summary>
        [ConfigurationProperty("dataSchema", IsRequired = false)]
        public string DataSchema
        {
            get
            {
                return (this["dataSchema"] as string) ?? "";
            }
            set
            {
                this["dataSchema"] = value;
            }
        }

        /// <summary>
        /// 获取或者设置模块的当前状态。
        /// </summary>
        /// <remarks>
        /// <para>目前支持 "Normal"（或中文 "正常"）、"Maintenance"（或中文 "维护"），不区分大小写。如果不提供，则默认为 "正常"。</para>
        /// <para>如果隶属应用的状态为 "维护"，则应用中所有模块的状态都将为 "维护"。如果需要提供自定义的客户端反馈信息，使用 "维护:自定义信息" 或 "Maintenance:自定义信息" 的格式。</para>
        /// <para>处在 "维护" 状态中的模块暂时不可访问，但是仍然会出现在用户导航列表中，并向用户提示 "正在维护" 的消息。</para>
        /// </remarks>
        [ConfigurationProperty("status", IsRequired = false)]
        public string Status
        {
            get
            {
                return (string)this["status"];
            }
            set
            {
                this["status"] = value;
            }
        }

        /// <summary>
        /// 获取配置文件定义的所有的功能配置项目的列表。
        /// </summary>
        [ConfigurationProperty("", IsDefaultCollection = true)]
        public FunctionConfigCollection Functions
        {
            get
            {
                return (FunctionConfigCollection)this[""];
            }
        }
    }
}
